/**
 * H5游戏JS SDK
 * 版本: 1.0.0
 * 功能: 支付、角色上传
 */

class H5GameSDK {
  constructor(options = {}) {
    // 默认配置
    this.defaults = {
      debug: false, // 调试模式
      gameId: '',   // 游戏ID
      serverId: '0', // 服务器ID
      channelId: '', // 渠道ID
      sdkVersion: '1.0.0'
    };

    // 合并配置
    this.config = Object.assign({}, this.defaults, options);

    // 初始化消息通信
    this._initMessageHandler();

    this._log('SDK初始化完成', this.config);

    // 回调函数存储
    this._callbacks = {};
  }

  /**
   * 初始化消息处理器 (用于跨域通信)
   */
  _initMessageHandler() {
    var self = this;
    window.addEventListener('message', function (event) {
      // 安全验证 - 建议在实际使用时验证event.origin
      // if (event.origin !== "https://your-trusted-domain.com") return;
      
      var data = event.data;
      if (data && data.type === 'h5game_sdk_response') {
        self._log('收到消息响应', data);
        
        // 处理回调
        if (data.callbackId && self._callbacks[data.callbackId]) {
          self._callbacks[data.callbackId](data.response);
          delete self._callbacks[data.callbackId];
        }
      }
    });
  }

  /**
   * 生成唯一ID
   */
  _generateCallbackId() {
    return 'cb_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
  }

  /**
   * 发送消息到父窗口
   */
  _sendMessageToParent(type, params, callback) {
    var callbackId = this._generateCallbackId();
    
    if (callback) {
      this._callbacks[callbackId] = callback;
    }

    var message = {
      type: 'h5game_sdk_request',
      requestType: type,
      params: params,
      callbackId: callbackId,
      sdkVersion: this.config.sdkVersion
    };

    this._log('发送消息到父窗口', message);
    
    // 跨域发送消息
    if (window.parent !== window) {
      window.parent.postMessage(message, '*'); // 生产环境应指定具体域名而非'*'
    } else {
      this._log('警告: 未检测到父窗口，可能不在iframe中运行');
      
      // 尝试直接调用方法 (非跨域情况)
      this._tryDirectCall(type, params, callback);
    }
  }

  /**
   * 尝试直接调用方法 (非跨域情况)
   */
  _tryDirectCall(type, params, callback) {
    try {
      if (type === 'payment' && typeof window.showPaymentModal === 'function') {
        var result = window.showPaymentModal(params);
        if (callback) { callback({success: true, data: result}); }
      } else if (type === 'create_role' && typeof window.createRole === 'function') {
        var result = window.createRole(params);
        if (callback) { callback({success: true, data: result}); }
      } else {
        if (callback) {
          callback({
            success: false,
            error: '方法未定义或环境不支持'
          });
        }
      }
    } catch (e) {
      if (callback) {
        callback({
          success: false,
          error: e.message
        });
      }
    }
  }

  /**
   * 支付接口
   * @param {Object} params 支付参数
   * @param {Function} callback 回调函数
   */
  pay(params, callback) {
    var paymentParams = {
      amount: params.amount,         // 金额(分)
      goods_name: params.goods_name,  // 商品名称
      num: params.num || 1,          // 商品数量(默认1)
      sid: params.serverId || this.config.serverId, // 服务器ID
      gid: params.gameId || this.config.gameId,     // 游戏ID
      uid: params.uid || '',        // 用户ID
      note: params.note || '',        // 备注
      sign: params.sign     // 签名
    };

    // 参数验证 支付金额必须大于 0 金额单位：分
    if (!paymentParams.amount || isNaN(paymentParams.amount) || paymentParams.amount <= 0) {
      if (callback) { callback({success: false, error: '金额必须为正整数'}); }
      return;
    }

    if (!paymentParams.goods_name) {
      if (callback) { callback({success: false, error: '商品名称不能为空'}); }
      return;
    }
    if (!paymentParams.sign) {
      if (callback) { callback({success: false, error: '签名不能为空'}); }
      return;
    }
    this._sendMessageToParent('payment', paymentParams, callback);
  }

  /**
   * 角色上传
   * @param {Object} roleInfo 角色信息
   * @param {Function} callback 回调函数
   */
  createRole(roleInfo, callback) {
    var roleParams = {
      role_id: roleInfo.role_id,         // 角色ID
      role_name: roleInfo.role_name,     // 角色名
      role_level: roleInfo.role_level,   // 角色等级
      role_power: roleInfo.role_power,   // 角色战力
      sid: roleInfo.sid || this.config.serverId, // 服务器ID
      gid: roleInfo.gameId || this.config.gameId,      // 游戏ID
      uid: roleInfo.uid || '',        // 用户ID
      sign: roleInfo.sign     // 签名
    };

    // 参数验证
    if (!roleParams.role_id) {
      if (callback) { callback({success: false, error: '角色ID不能为空'}); }
      return;
    }

    if (!roleParams.role_name) {
      if (callback) { callback({success: false, error: '角色名不能为空'}); }
      return;
    }

    if (!roleParams.role_level || isNaN(roleParams.role_level) || roleParams.role_level < 0) {
      if (callback) { callback({success: false, error: '角色等级必须为非负整数'}); }
      return;
    }

    this._sendMessageToParent('create_role', roleParams, callback);
  }

  /**
   * 日志记录
   */
  _log() {
    if (this.config.debug) {
      var args = Array.prototype.slice.call(arguments);
      console.log.apply(console, ['[H5GameSDK]'].concat(args));
    }
  }
}

// 导出SDK
if (typeof window !== 'undefined') {
  window.H5GameSDK = H5GameSDK;
}